import json
import os.path

import jmespath
import requests
from loguru import logger
import allure

"""
基础工具函数send_request设计思路：
1.将发送请求数据和响应数据记录到日志中
2.将发送请求数据和响应数据记录到allure报告中
"""
# ---------------------------------------第一步：配置日志------------------------------------
# 第一步定义日志输出位置
# 先获取到工程目录
current_dir = os.path.dirname(__file__)
current_dir = os.path.dirname(current_dir)
# 再将工程目录和工程中日志位置拼接
log_path = current_dir + '\\log\\apiLog.log'
# 再使用logger组件声明生成日志的地址为log_path
logger.add(log_path)
# 最后设置生成的日志不要在控制台输出
logger.remove(0)


# ---------------------------------------第二步：封装基础方法--------------------------------

def send_request(name, url, method, **kwargs):
    session = requests.session()
    try:
        # 发送接口请求
        r = session.request(url=url, method=method, **kwargs)
        # 将请求和 响应数据记录到 日志中
        logger.info(f'接口名：-------------------------{name}-------------------------')
        logger.info(f"接口路径: {r.request.url}")
        logger.info(f"请求方式: {r.request.method}")
        logger.info(f"请求头: {r.request.headers}")
        # 使用 json.loads() 将字节数据解码为字符串，并解析为 Python 字典
        if r.request.body is not None:  # get请求没有请求体，绕过下方代码，否则报错
            logger.info(f"请求体: \n{json.dumps(json.loads(r.request.body.decode('utf-8')), indent=5, ensure_ascii=False)}")
        logger.info(f"http响应码: {r.status_code}")
        logger.info(f"http响应信息: {r.reason}")
        logger.info(f"响应头: {r.headers}")
        logger.info(f"响应体: \n{json.dumps(r.json(), indent=5, ensure_ascii=False)}")

        # 设置在allure中打印出日志的格式
        if r.request.body is not None:
            request_data = f"""
URL: \n{r.request.url}\n\n
Method: \n{r.request.method}\n\n
Headers: \n{r.request.headers}\n\n
Body: \n{json.dumps(json.loads(r.request.body.decode('utf-8')), indent=5, ensure_ascii=False)}"""
        else:
            request_data = f"""
URL: \n{r.request.url}\n\n
Method: \n{r.request.method}\n\n
Headers: \n{r.request.headers}\n\n
                        """

        response_data = f'''
Status Code: \n{r.status_code}\n\n
Status Msg: \n{r.reason}\n\n
Headers: \n{dict(r.headers)}\n\n
Body: \n{json.dumps(r.json(), indent=5, ensure_ascii=False)}'''

        allure.attach(request_data, name='接口请求信息', attachment_type=allure.attachment_type.TEXT)
        allure.attach(response_data, name='接口响应信息', attachment_type=allure.attachment_type.TEXT)

        # 设置将接口日志输入到报告中
        allure.attach(request_data, name="接口请求信息",
                      attachment_type=allure.attachment_type.TEXT)
        allure.attach(response_data, name="接口响应信息",
                      attachment_type=allure.attachment_type.TEXT)

        return r
    except requests.RequestException as e:
        logger.error(f"Request failed: {str(e)}")





